//1.导入express
const express = require('express')

const fs = require('fs')

//封装db
const { getDb, saveDb } = require('./db')

//2.创建web服务器
const app = express()

//如果想要获取客户端请求体参数在express中，需要做一些配置
//配置解析表单请求体
app.use(express.json())
//也是表单请求体:application/x-www-form-urlencoded
app.use(express.urlencoded())
//查询列表任务
app.get('/todos', async (req, res) => {
  //异步捕获
  try {
    const db = await getDb()
    res.status(200).json(db.todos)
  } catch (err) {
    res.status(500).json({
      error: err.message
    })
  }
  // fs.readFile('./db.json','utf8',(err,data) => {
  //   if (err) {
  //     console.log(err);
  //     return res.status(500).json({
  //       error:err.message
  //     })
  //   }
  //   // 把读到的字符串转换成js对象，json
  //   const db = JSON.parse(data)
  //   res.status(200).json(db.todos)
  // })
})
//根据id查询单个任务
app.get('/todos/:id', (req, res) => {
  // 得到id,使用req.params.id
  // res.send(`'get / todos/:id'${req.params.id}`)
  fs.readFile('./db.json', 'utf8', async (err, data) => {
    try {
      const db = await getDb()
      const todo = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))
      if (!todo) {
        res.status(404).end()
      }
      res.status(200).json(todo)
    } catch {
      res.status(500).json({
        error: err.message
      })
    }
  })
})
//添加任务
app.post('/todos', async(req, res) => {
  try {
    //1.获取客户端请求体参数
    // console.log(req.body);
    const todo = req.body
    //2.数据验证
    if (!todo.title) {
      return res.status(422).json({
        error: 'The field title is required.'
      })
    }
    //3.数据验证通过,把数据存储到db中
    const db = await getDb()
    //判断是否为空
    const lastTodo = db.todos[db.todos.length - 1]
    todo.id = lastTodo ? lastTodo.id + 1 : 1
    db.todos.push(todo)
    await saveDb(db)
    //4.发生响应
    res.status(201).json(todo)
  } catch (err) {
    res.status(500).json({
      error: err.message
    })
  }
})
//修改任务
app.patch('/todos/:id', async(req, res) => {
  try {
    //1.获取表单数据
    const todo = req.body
    //2.查找到要修改的任务项
    const db = await getDb()
    const ret = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))
    if (!ret) {
      return res.status(404).end()
    }
    // ret查到的数据,把todo合并到ret上去
    Object.assign(ret,todo)
    await saveDb(db)

    res.status(200).json(ret)
  } catch (err){
    res.status(500).json({
      error:err.message
    })
  }
})
//删除任务
app.delete('/todos/:id', async(req, res) => {
  try {
    const todoId = Number.parseInt(req.params.id)
    const db = await getDb()
    const index = db.todos.findIndex(todo => todo.id ===todoId)
    if (index === -1) {
      return res.status(404).end()
    }
    db.todos.splice(index,1)
    await saveDb(db)
    res.status(204).end()
  } catch (err) {
    res.status(500).json({
      error:err.message
    })
  }
})





//3.启动web服务器
app.listen(3000, () => {
  console.log('express server running at http://127.0.0.1:3000');
})